#ifdef SU1
//#define _GLIBCXX_DEBUG
#endif

#include <algorithm>
#include <bitset>
#include <cassert>
#include <climits>
#include <cstring>
#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <cmath>
#include <fstream>
#include <iostream>
#include <iomanip>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <stack>
#include <set>
#include <string>
#include <utility>
#include <vector>

using namespace std;

#define forn(i, n) for (int i = 0; i < int(n); i++)
#define forl(i, n) for (int i = 1; i <= int(n); i++)
#define ford(i, n) for (int i = int(n) - 1; i >= 0; i--)
#define fore(i, l, r) for (int i = int(l); i <= int(r); i++)
#define pb(a) push_back(a)
#define mp(x, y) make_pair((x), (y))
#define sz(a) (int) (a).size()
#define all(a) (a).begin(), (a).end()
#define ft first
#define sc second
#define x first
#define y second

template<typename X> inline X abs(const X& a) { return a < 0 ? -a : a; }
template<typename X> inline X sqr(const X& a) { return a * a; }

typedef long long li;
typedef long double ld;
typedef pair<int, int> pt;

const int INF = int(1e9);
const li INF64 = li(1e18);
const ld PI = acosl(ld(-1));
const ld EPS = 1e-9;

#ifdef SU1
#define LLD "%I64d"
#else
#define LLD "%lld"
#endif

const int MOD = 1e9 + 7;

const int N = 2050;
int n, x;
li d;

inline bool read()
{
	//assert(scanf("%d" LLD "%d", &n, &d, &x) == 3);
	n = 2000;
	d = li(1e12);
	x = 2000;
	if (n == 0 && d == 0 && x == 0) return false;
	return true;
}

inline int binPow (int a, int b)
{
	li res = 1;
	while (b)
	{
		if (b & 1)
		{
			res *= a;
			if (res >= MOD) res %= MOD;
			b--;
		} else
		{
			a = (int) ((a * 1LL * a) % MOD);
			b >>= 1;
		}
	}
	return int(res);
}

inline int Inv (int x) { return binPow(x, MOD - 2); }

int inv[N];
int dd[2][N];
int psum[N];

int used[N][N];
int cused;
int z[N][N];
int c(li n, int k) {
	li ans = 1;
	
	for (li i = n, j = 1; j <= k; i--, j++)
	{
		int cur = int(i >= MOD ? (i % MOD) : i);
		ans *= cur;
		if (ans >= MOD) ans %= MOD;
		ans *= inv[(int)j];
		if (ans >= MOD) ans %= MOD;
	}
	
	return int(ans);
}

inline void solve()
{
	cused++;
	int prev = 0, cur = 1;
	dd[prev][0] = 1;
	for(int i = 1; i < N; i++)
		dd[prev][i] = 0;
	int ans = 0;
	forn(i, n) {
		psum[0] = dd[prev][0];
		for (int j = 1; j <= n; j++) {
			psum[j] = psum[j - 1] + dd[prev][j];
			if (psum[j] >= MOD)
				psum[j] -= MOD;
		}
		dd[cur][0] = 0;
		for(int j = 1; j <= n; j++) {
			dd[cur][j] = psum[j - 1];
			if (j - x >= 0) {
				dd[cur][j] -= psum[j - x];
				if (dd[cur][j] < 0)
					dd[cur][j] += MOD;
			}
		}
		
		int cval = dd[cur][n];
//		cerr << i + 1 << ' ' << cval << ' ' << c(d, i + 1) << endl;
		ans = int((ans + cval * 1LL * c(d, i + 1)) % MOD);
		
		swap(prev, cur);
	}
	printf("%d\n", ans);
}

int main()
{
#ifdef SU1
	assert(freopen("input.txt", "rt", stdin));
//	assert(freopen("output.txt", "wt", stdout));
#endif

	cout << fixed << setprecision(10);
	cerr << fixed << setprecision(5);
	
	forl(i, N - 1) inv[i] = Inv(i);

	//while (read())
	forn(iter, 33)
	{
		read();
		solve();
	}
			
#ifdef SU1
	cerr << "=== TIME : " << clock() << " ===" << endl;
#endif
	return 0;
}
